package com.device.graphics;

import javax.microedition.khronos.opengles.GL10;
import javax.microedition.khronos.opengles.GL11;

import android.opengl.GLU;
import android.graphics.Matrix;;



/**
 * グラフィックス機能
 *
 * @author function
 */
public class GraphicsDevice
{
	// OpenGLのパイプライン
	private GL11	gl_;

	/**
	 * コンテキスト
	 */
	public GraphicsDevice()
	{}

	/**
	 * 初期化
	 */
	public void initialize( GL11 gl )
	{
		 // アンチエイリアスの無効
		gl.glDisable( GL11.GL_DITHER );

		// カラーとテクスチャ座標の補間精度を最も効率的
		gl.glHint( GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_FASTEST );

		// カリング
		gl.glEnable( GL11.GL_CULL_FACE );
		gl.glCullFace( GL11.GL_SMOOTH );

		// 半透明の有効
		gl.glEnable( GL11.GL_BLEND );
		gl.glBlendFunc( GL11.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA );

		// αテストの有効化
		gl.glEnable( GL11.GL_ALPHA_TEST );
		gl.glAlphaFunc( GL11.GL_GREATER, 0.0f );

		// テクスチャの有効化
		gl.glEnable( GL11.GL_TEXTURE_2D );

		// 左回りの面を表面に
		gl.glFrontFace( GL11.GL_CCW );

		// Zバッファ有効化
		gl.glEnable( GL11.GL_DEPTH_TEST );
		gl.glDepthMask( true );

		// Zバッファで入って来る深度値が格納された深度値以下である時に通過
		gl.glDepthFunc( GL11.GL_LEQUAL );
	}

	/**
	 * ViewPortの設定
	 *
	 * @param width		画面の横長さ
	 * @param height	画面の縦長さ
	 */
	public void setViewPort( GL11 gl, int width, int height )
	{
		gl.glViewport( 0, 0, width, height );
	}

	/**
	 * 透視変換行列の設定
	 */
	public void setPerspective()
	{
		float width = getWidth();
		float heigth = getHeight();

		gl_.glMatrixMode( GL11.GL_PROJECTION );
		gl_.glLoadIdentity();
		GLU.gluPerspective( gl_, 50, width / heigth, 0.1f, 10.0f );

	}

	/**
	 * 視界変換行列の設定
	 *
	 * @param eye*		視点の位置
	 * @param center*		注視点の位置
	 * @param eye*		視点のベクトル
	 */
	public void setLookAt( float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ )
	{
		gl_.glMatrixMode( GL11.GL_MODELVIEW );
		gl_.glLoadIdentity();
		GLU.gluLookAt( gl_, eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ );
	}

	/**
	 * 正射影行列の設定
	 *
	 * @param width		画面の横長さ
	 * @param height	画面の縦長さ
	 */
	public void setOrth2D( float x, float y, float width, float height )
	{
		gl_.glMatrixMode( GL11.GL_PROJECTION );
		gl_.glLoadIdentity();
		GLU.gluOrtho2D( gl_, x, y, width, height );
	}

	/**
	 * ビューポートの横サイズ取得(これが端末の横サイズになるはず)
	 *
	 * @return　横サイズ
	 */
	public float getWidth()
	{
		float[] viewPort = new float[4];

		gl_.glGetFloatv( GL11.GL_VIEWPORT, viewPort, 0 );

		return viewPort[2];
	}

	/**
	 * ビューポートの縦サイズ取得(これが端末の縦サイズになるはず)
	 *
	 * @return　縦サイズ
	 */
	public float getHeight()
	{
		float[] viewPort = new float[4];

		gl_.glGetFloatv( GL11.GL_VIEWPORT, viewPort, 0 );

		return viewPort[3];
	}

	/**
	 * 描画の開始準備
	 */
	public void begin( GL11 gl )
	{
		gl_ = (GL11)gl;

		gl_.glClearColor( 1.0f, 1.0f, 1.0f, 1.0f );
		gl_.glClear( GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT );

	}


	/**
	 *	行列を設定しないで描画
	 *
	 * @param positionX
	 * @param positionY
	 */
	public void draw( float positionX, float positionY )
	{

	}
}